/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gruppenkalenderProjekt.kalenderinterface;

import gruppenkalenderProjekt.data.Benutzer;
import gruppenkalenderProjekt.data.Kalender;
import gruppenkalenderProjekt.data.Kalendereintrag;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Calendar;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *  Masterklasse
 * @author Gruppe 2
 */
public class GruppenkalenderInterface implements ActionListener {

// Alle "Unterklassen" werden instanziert
    private InterfaceClient ic;
    private Login l;
    private Start s = new Start();
    private Editor ed;
    private ReportGenerator rg;
    private Kalenderanlage ka;
    private Benutzeranlage ba;
    private Kategorieanlage kata;
    private Vector<Benutzer> alleBenutzer;
    private Vector<Kalender> alleKalender;
    private Vector<Kalendereintrag> alleKalendereintrage;
    private Vector<Kalendereintrag> alleKalendereintraegeVonBenutzer;
    public static GruppenkalenderInterface gkiGlobal = null;
    private Vector<Kalender> alleKalendervonBenutzer = null;
    private Benutzer aktuellerBenutzer; //Benutzerobjekt anstatt nur eines Strings
    private Vector<Kalender> kalenderVonBenutzer = null;
    //Frame
    private static String frameString = "Gruppenkalender Gruppe 2 - Editor";
    JFrame frame = new JFrame(frameString);
    //Abfrage auf Erinnerung/Alarm
    private Timer timer;
    private int delayTimer = 1000 * 60; //alle 60 Sekunden Erinnerung abfragen
    private File file;
    private String serverIP = "";
    public Container contentPane = null;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (UnsupportedLookAndFeelException e) {
            System.out.println("RemoteException");
            System.out.println(e);
        } catch (ClassNotFoundException e) {
            System.out.println("RemoteException");
            System.out.println(e);
        } catch (InstantiationException e) {
            System.out.println("RemoteException");
            System.out.println(e);
        } catch (IllegalAccessException e) {
            System.out.println("RemoteException");
            System.out.println(e);
        }

        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                try {
                    createAndShowGUI();
                } catch (RemoteException ex) {
                    Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    private static void createAndShowGUI() throws RemoteException {
        GruppenkalenderInterface gki = new GruppenkalenderInterface();
        gki.generateComponents();
        gkiGlobal = gki;
    }

    public void generateComponents() throws RemoteException {


        //Frame
        JFrame.setDefaultLookAndFeelDecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setBounds(250, 100, 800, 600);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setIconImage(new ImageIcon("herz.jpg").getImage());
        //Panel
        l = new Login();
        JPanel loginPane = l.generateComponents(this);
        JPanel contentPane = (JPanel) frame.getContentPane();
        contentPane.add(loginPane);



        file = new File("alarm.wav");

        timer = new Timer(delayTimer, this);
        timer.setActionCommand("Timer");


    }

    public void setAktuellerBenutzer(Benutzer benutzer) {
        this.aktuellerBenutzer = benutzer;
    }

    public Benutzer getAktuellerBenutzer() {
        return this.aktuellerBenutzer;
    }

    public Vector<Kalender> getKalenderVonBenutzer() {
        return this.kalenderVonBenutzer;
    }
    // Methode, die die Klickaktionen empfängt und auswertet

    public void actionPerformed(ActionEvent e) {
        // Aktion 1: Login-Button wird gedrückt.
        if (e.getActionCommand().equals("Login")) {
            try {
                //Die IP aus Textfeld
                serverIP = l.getIP();
                ic = new InterfaceClient(serverIP);
                alleKalender = ic.getAlleKalender();
                alleBenutzer = ic.getAlleBenutzer();
                System.out.println("Anzahl Benutzer " + alleBenutzer.size());
                alleKalendereintrage = ic.getAlleKalendereintraege();



                for (int i = 0; i < alleBenutzer.size(); i++) {
                    if (l.getBenutzername().equals(alleBenutzer.elementAt(i).getBenutzername())) {
                        // Gibt es einen Benutzer mit dem Benutzernamen?
                        this.aktuellerBenutzer = alleBenutzer.elementAt(i);
                        Start s = new Start();
                        JPanel startPane = s.generateComponents(this); //Das Startpane erzeugen
                        frame.setContentPane(startPane); //Das Startpane dem Mainframe zuweisen
                        frame.repaint(); //den Frame + Inahlt neu zeichnen
                        frame.setVisible(true); //Frame + Inhalt sichtbar setzen
                        
                            if (ic.getAlleKalendereintraegeVonBenutzer(aktuellerBenutzer.getBenutzerID()) != null) {
                                alleKalendereintraegeVonBenutzer = ic.getAlleKalendereintraegeVonBenutzer(aktuellerBenutzer.getBenutzerID());
                                timer.start(); //Timer fuer Erinnerung starten
                            }
                        }
                    
                }
            } catch (RemoteException ex) {

                Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException npe) {
                String message = (String) ("Applikationsserver ist nicht erreichbar. Bitte überprüfen Sie die IP-Adresse.");
                JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);

                Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, npe);

            }
        }
        //Aktion 2: Schliessen-Button wird gedrückt
        if (e.getActionCommand().equals("Beenden")) {
            System.exit(0);
        }

        //Aktion 4: Neuer Eintrag-Button wird gedrückt
        if (e.getActionCommand().equals("NeuerEintrag")) {
            JPanel startPane; //Das Startpane erzeugen
            try {
                //hole alle Kalender des eingeloggten Benutzers aus DB                
                kalenderVonBenutzer = ic.getAlleKalenderVonSuperbenutzer(this.aktuellerBenutzer.getBenutzerID());
                ed = new Editor();
                startPane = ed.generateComponents(this);
                frame.setContentPane(startPane); //Das Startpane dem Mainframe zuweisen
                frame.repaint();//den Frame + Inhalt neu zeichnen
                frame.setVisible(true); //Frame + Inhalt sichtbar setzen
            } catch (RemoteException ex) {
                System.out.println("RemoteException");
                System.out.println(ex);
            }

        }

        //Aktion 5: Neuer Kalender-Button wird gedrückt
        if (e.getActionCommand().equals("KalenderBearbeiten")) {
            JPanel startPane; //Das Startpane erzeugen
            try {
                //Das Startpane erzeugen
                ka = new Kalenderanlage();
                startPane = ka.generateComponents(this);
                frame.setContentPane(startPane); //Das Startpane dem Mainframe zuweisen
                frame.repaint();//den Frame + Inhalt neu zeichnen
                frame.setVisible(true); //Frame + Inhalt sichtbar setzen
            } catch (RemoteException ex) {
                Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
            }


        }

        //Aktion 6: Neuer Benutzer-Button wird gedrückt
        if (e.getActionCommand().equals("NeuerBenutzer")) {
            JPanel startPane; //Das Startpane erzeugen
            try {
                //Das Startpane erzeugen
                ba = new Benutzeranlage();
                startPane = ba.generateComponents(this);
                frame.setContentPane(startPane); //Das Startpane dem Mainframe zuweisen
                frame.repaint();//den Frame + Inhalt neu zeichnen
                frame.setVisible(true); //Frame + Inhalt sichtbar setzen
            } catch (RemoteException ex) {
                Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        //Aktion 7: Neue Kategorie-Button wird gedrückt
        if (e.getActionCommand().equals("NeueKategorie")) {
            //Das Startpane erzeugen
            try {
                JPanel startPane; //Das Startpane erzeugen
                //Das Startpane erzeugen
                kata = new Kategorieanlage();
                startPane = kata.generateComponents(this);
                frame.setContentPane(startPane); //Das Startpane dem Mainframe zuweisen
                frame.repaint(); //den Frame + Inhalt neu zeichnen
                frame.setVisible(true); //Frame + Inhalt sichtbar setzen            
            } catch (RemoteException ex) {
                Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        //Aktion 8: Fragezeichen-Button wird gedrückt
        if (e.getActionCommand().equals("Fragezeichen")) {
            String message = (String) (("Die Hilfe wird erst in der zweiten Revision ausgeliefert"));
            JOptionPane.showMessageDialog(null, message, "Nicht verfügbar", 2, null);

        }

        //Aktion 9: Abbrechen-Button im Editor wird gedrückt
        if (e.getActionCommand().equals("Abbrechen")) {
            s = new Start();
            JPanel startPane; //Das Startpane erzeugen

            aktualisiereDaten();

            startPane = s.generateComponents(this);
            frame.setContentPane(startPane); //Das Startpane dem Mainframe zuweisen
            frame.repaint();//den Frame + Inhalt neu zeichnen
            frame.setVisible(true); //Frame + Inhalt sichtbar setzen


        }

        //Aktion 10: NeuerKalendereintrag-Button im Editor wird gedrückt
        if (e.getActionCommand().equals("NeuerKalendereintrag")) {
            System.out.println("Neuer Kalendereintrag gedrueckt");
            ed.neuerKalendereintrag();
        }
        //Aktion 11: Speichern-Button im Editor wird gedrückt
        if (e.getActionCommand().equals("SpeicherKalendereintrag")) {
            System.out.println("Speicher Kalendereintrag gedrueckt");
            ed.updateAktuellenKalendereintrag();
        }
        //Aktion 12: Lösche-Button im Editor wird gedrückt
        if (e.getActionCommand().equals("LoescheKalendereintrag")) {
            String message = (String) (("Wollen sie den Kalendereintrag " + "" + " wirklich löschen?"));
            int eingabe = JOptionPane.showConfirmDialog(null, message, "Löschen", JOptionPane.OK_CANCEL_OPTION);
            if (eingabe == 0) {
                System.out.println("JA gewält");
                ed.loescheKalendereintrag();

            }


        }
        //Aktion 13: Timer abfangen
        if (e.getActionCommand().equals("Timer")) {

            try {
                Calendar current = Calendar.getInstance();
                Calendar temp = Calendar.getInstance();
                for (int i = 0; i < alleKalendereintraegeVonBenutzer.size(); i++) {
                    temp.setTime(alleKalendereintraegeVonBenutzer.elementAt(i).getStartdatum());
                    temp.set(Calendar.HOUR_OF_DAY, alleKalendereintraegeVonBenutzer.elementAt(i).getStartzeit().getHours());
                    temp.set(Calendar.MINUTE, alleKalendereintraegeVonBenutzer.elementAt(i).getStartzeit().getMinutes());
                    temp.add(Calendar.MINUTE, -alleKalendereintraegeVonBenutzer.elementAt(i).getZeitdifferenzErinnerung());
                    if (current.getTime().getYear() == temp.getTime().getYear()) {
                        if (current.getTime().getMonth() == temp.getTime().getMonth()) {
                            if (current.getTime().getDay() == temp.getTime().getDay()) {
                                if (current.getTime().getHours() == temp.getTime().getHours()) {
                                    if (current.getTime().getMinutes() == temp.getTime().getMinutes()) {
                                        if (alleKalendereintraegeVonBenutzer.elementAt(i).isAlarm()) {
                                            try {
                                                //erstellt einen Audio Stream, der das File einliest, welches als Attribut festgelegt ist
                                                AudioInputStream audioIn = AudioSystem.getAudioInputStream(file);
                                                // holt sich einen Clip
                                                Clip clip = AudioSystem.getClip();
                                                // Oeffnet den Clip und steckt den Stream hinein
                                                clip.open(audioIn);
                                                clip.start(); //Sound einmal abspielen
                                                // clip.loop(10);//Hiermit koennte man den Sound als Dauerschleife abspielen
                                            } catch (UnsupportedAudioFileException ex) {
                                                ex.printStackTrace();
                                            } catch (IOException ex) {
                                                ex.printStackTrace();
                                            } catch (LineUnavailableException ex) {
                                                ex.printStackTrace();
                                            }
                                        }
                                        String message = (String) ("Sie haben folgenden Termin: \n" +
                                                alleKalendereintraegeVonBenutzer.elementAt(i).getTitel() + "\n" +
                                                "Beschreibung: " + alleKalendereintraegeVonBenutzer.elementAt(i).getBeschreibung() + "\n" +
                                                "In: " + alleKalendereintraegeVonBenutzer.elementAt(i).getZeitdifferenzErinnerung() + " Minute(n) \n" +
                                                "Start: " + alleKalendereintraegeVonBenutzer.elementAt(i).getStartzeit() + " Uhr \n" +
                                                "Ort: " + alleKalendereintraegeVonBenutzer.elementAt(i).getOrt() + "\n");
                                        JOptionPane.showMessageDialog(null, message, "Erinnerung", 2, null);
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public GruppenkalenderInterface getGki() {
        return gkiGlobal;
    }

    public String getServerIP() {
        return serverIP;
    }

    public Vector<Kalender> getAlleKalender() {
        return alleKalender;
    }

    public Vector<Benutzer> getAlleBenutzer() {
        return alleBenutzer;
    }

    public void setAlleBenutzer() {
        alleBenutzer = ic.getAlleBenutzer();
    }

    public Container getContentPane() {
        return contentPane;
    }

    public InterfaceClient getIC() {
        return this.ic;
    }

    private void aktualisiereDaten() {
        try {
            System.out.println("Aktualisieren Daten!");
            alleKalender = ic.getAlleKalender();
            alleBenutzer = ic.getAlleBenutzer();
            alleKalendereintrage = ic.getAlleKalendereintraege();
            alleKalendereintraegeVonBenutzer = ic.getAlleKalendereintraegeVonBenutzer(aktuellerBenutzer.getBenutzerID());
        } catch (RemoteException ex) {
            Logger.getLogger(GruppenkalenderInterface.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

        
        
       








